package com.liangsui.mss.srevice.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liangsui.mss.constants.Constants;
import com.liangsui.mss.domain.Patient;
import com.liangsui.mss.domain.PatientFile;
import com.liangsui.mss.dto.PatientDto;
import com.liangsui.mss.dto.PatientFileDto;
import com.liangsui.mss.mapper.PatientFileMapper;
import com.liangsui.mss.mapper.PatientMapper;
import com.liangsui.mss.service.PatientService;
import com.liangsui.mss.utils.AppMd5Utils;
import com.liangsui.mss.vo.DataGridView;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.config.annotation.Method;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;

/**
* @author zhang
* @description 针对表【his_patient(患者信息表)】的数据库操作Service实现
* @createDate 2022-12-06 22:36:39
*/
@DubboService(methods = {@Method(name="addPatient", retries = 0), @Method(name = "getPatientByUsername", retries = 0),
        @Method(name = "updatePatientInfoByPhone", retries = 0), @Method(name="addPatientFile", retries = 0)}, timeout = 5000)
public class PatientServiceImpl extends ServiceImpl<PatientMapper, Patient> implements PatientService{
    /**
     * @功能描述:患者信息
     */
    @Autowired
    private PatientMapper patientMapper;

    /**
     * @功能描述:患者档案
     */
    @Autowired
    private PatientFileMapper patientFileMapper;

    /**
     * @param patientDto
     * @功能描述:分页查询所有患者信息
     */
    @Override
    public DataGridView listPatientForPage(PatientDto patientDto) {
        Page<Patient> page = new Page<>(patientDto.getPageNum(), patientDto.getPageSize());
        QueryWrapper<Patient> qw = new QueryWrapper<>();
        qw.like(StringUtils.isNotBlank(patientDto.getName()),
                Patient.COL_NAME, patientDto.getName());
        qw.like(StringUtils.isNotBlank(patientDto.getIdCard()),
                Patient.COL_ID_CARD, patientDto.getIdCard());
        qw.like(StringUtils.isNotBlank(patientDto.getPhone()),
                Patient.COL_PHONE, patientDto.getPhone());
        this.patientMapper.selectPage(page, qw);
        System.out.println( page.getRecords());
        return new DataGridView(page.getTotal(), page.getRecords());
    }

    /**
     * @param patientId
     * @功能描述:根据患者ID查询患者信息
     */
    @Override
    public Patient getPatientById(String patientId) {
        return this.patientMapper.selectById(patientId);
    }

    /**
     * @param patientId
     * @功能描述:根据患者ID查询患者的档案信息
     */
    @Override
    public PatientFile getPatientFileById(String patientId) {
        return this.patientFileMapper.selectById(patientId);
    }

    /**
     * 根据患者身份证查询患者信息
     * @param idCard
     * @return
     */
    @Override
    public Patient getPatientByIdCard(String idCard) {
        Wrapper<Patient> wrapper=new QueryWrapper<>();
        ((QueryWrapper<Patient>) wrapper).eq(Patient.COL_ID_CARD,idCard);
        return this.patientMapper.selectOne(wrapper);
    }

    @Override
    public Patient getPatientByUsername(String username, String password) {
        Wrapper<Patient> wrapper = new QueryWrapper<>();
        ((QueryWrapper<Patient>) wrapper).eq(Patient.COL_PHONE, username);
        Patient patient = patientMapper.selectOne(wrapper);
        String ver = AppMd5Utils.md5(password, username, 2);
        String verPassword = patient.getPassword();
        if (ver.equals(verPassword)) {
            return patient;
        } else {
            return null;
        }
    }

    @Override
    public Patient updatePatientInfoByPhone(PatientDto patientDto) {
        UpdateWrapper<Patient> wrapper = new UpdateWrapper<>();
        wrapper.eq(Patient.COL_PHONE, patientDto.getPhone());
        wrapper.set(Patient.COL_NAME, patientDto.getName());
        wrapper.set(Patient.COL_SEX, patientDto.getSex());
        wrapper.set(Patient.COL_ID_CARD, patientDto.getIdCard());
        wrapper.set(Patient.COL_ADDRESS, patientDto.getAddress());
        wrapper.set(Patient.COL_BIRTHDAY, patientDto.getBirthday());
        wrapper.set(Patient.COL_UPDATE_TIME, new Date());
        patientMapper.update(null, wrapper);
        return getPatientByPhone(patientDto.getPhone());
    }

    @Override
    public int updatePassword(String username, String password) {
        UpdateWrapper<Patient> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq(Patient.COL_PHONE, username);
        updateWrapper.set(Patient.COL_PASSWORD, AppMd5Utils.md5(password, username, 2));
        return patientMapper.update(null, updateWrapper);
    }

    @Override
    public Patient getPatientByPhone(String phone) {
        QueryWrapper<Patient> selectWrapper = new QueryWrapper<>();
        selectWrapper.eq(Patient.COL_PHONE, phone);
        return patientMapper.selectOne(selectWrapper);
    }

    /**
     * 小程序完善用户档案
     * @param patientFileDto
     * @return
     */
    @Override
    public void addPatientFile(PatientFileDto patientFileDto) {
        PatientFile patientFile = new PatientFile();
        BeanUtil.copyProperties(patientFileDto, patientFile);
        patientFile.setCreateTime(DateUtil.date());
        patientFile.setUpdateTime(DateUtil.date());
        patientFileMapper.insert(patientFile);
        // 把患者表的是否完善改为已完善
        UpdateWrapper<Patient> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq(Patient.COL_PATIENT_ID, patientFileDto.getPatientId());
        updateWrapper.set(Patient.COL_IS_FINAL, Constants.IS_FINAL_TRUE);
        updateWrapper.set(Patient.COL_UPDATE_TIME, DateUtil.date());
        patientMapper.update(null, updateWrapper);
    }

    /**
     * 小程序修改用户档案
     * @param patientFileDto
     */
    @Override
    public void updatePatientFile(PatientFileDto patientFileDto) {
        PatientFile patientFile = new PatientFile();
        BeanUtil.copyProperties(patientFileDto, patientFile);
        patientFile.setUpdateTime(DateUtil.date());
        patientFileMapper.updateById(patientFile);
    }

    /**
     * 挂号时，患者信息不存在是添加患者信息
     * @param patientDto
     * @return
     */
    @Override
    public Patient addPatient(PatientDto patientDto) {
        Patient patient = new Patient();
        BeanUtil.copyProperties(patientDto, patient);
        patient.setCreateTime(DateUtil.date());
        patient.setIsFinal(Constants.IS_FINAL_FALSE);
        String defaultPwd = patient.getPhone().substring(5);
        patient.setPassword(AppMd5Utils.md5(defaultPwd, patient.getPhone(),2));
        this.patientMapper.insert(patient);
        return patient;
    }
}




